package com.dzu.medium;

import java.util.Arrays;

/**
 * @author ZhaoDong
 * @date 2022/9/14 10:45
 * @description 453. 最小操作次数使数组元素相等
 * 给你一个长度为 n 的整数数组，每次操作将会使 n - 1 个元素增加 1 。返回让数组所有元素相等的最小操作次数。
 *
 *  
 *
 * 示例 1：
 *
 * 输入：nums = [1,2,3]
 * 输出：3
 * 解释：
 * 只需要3次操作（注意每次操作会增加两个元素的值）：
 * [1,2,3]  =>  [2,3,3]  =>  [3,4,3]  =>  [4,4,4]
 * 示例 2：
 *
 * 输入：nums = [1,1,1]
 * 输出：0
 *  
 *
 * 来源：力扣（LeetCode）
 * 链接：https://leetcode.cn/problems/minimum-moves-to-equal-array-elements
 * 著作权归领扣网络所有。商业转载请联系官方授权，非商业转载请注明出处。
 */
public class Test453 {


    /**
     * 如果我们只是希望让所有元素相等；只看相对差距的话，那选出n-1个增加1和剩下那个减少1有什么区别？没有区别！
     * 那么我们如何进行若干次减少1的操作使得所有元素相等呢？
     * 很简单：我们让所有元素都变成最小的即可。
     *
     * 所以两步走：
     *
     * 遍历一遍所有元素，找到最小的元素。
     * 再遍历一遍，累加所有元素和最小元素的差距。每一个元素都要进行delta次操作，才能变成最小的元素。
     *
     * 作者：wfnuser
     * 链接：https://leetcode.cn/problems/minimum-moves-to-equal-array-elements/solution/wei-rao-li-lun-xuan-chu-n-1ge-zeng-jia-1-czj7/
     * 来源：力扣（LeetCode）
     * 著作权归作者所有。商业转载请联系作者获得授权，非商业转载请注明出处。
     * @param nums
     * @return
     */
    public static int minMoves(int[] nums) {
        int minNum = Arrays.stream(nums).min().getAsInt();
        int res = 0;
        for (int num : nums) {
            res += num - minNum;
        }
        return res;

    }
}
